/**
 * 
 */
package com.cplsystems.incidencias.vm.cuentas;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import org.zkoss.bind.BindContext;
import org.zkoss.bind.BindUtils;
import org.zkoss.bind.annotation.BindingParam;
import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.ContextParam;
import org.zkoss.bind.annotation.ContextType;
import org.zkoss.bind.annotation.GlobalCommand;
import org.zkoss.bind.annotation.Init;
import org.zkoss.bind.annotation.NotifyChange;
import org.zkoss.image.AImage;
import org.zkoss.image.Image;
import org.zkoss.util.media.Media;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.UploadEvent;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Window;

import com.cplsystems.incidencias.app.utils.ImageUtils;
import com.cplsystems.incidencias.app.utils.IncidenciasConstants;
import com.cplsystems.incidencias.app.utils.IncidenciasUtils;
import com.cplsystems.incidencias.business.ClavePersonal;
import com.cplsystems.incidencias.business.ConceptosCobranza;
import com.cplsystems.incidencias.business.Domicilio;
import com.cplsystems.incidencias.business.Organizacion;
import com.cplsystems.incidencias.business.OrganizacionDomicilio;
import com.cplsystems.incidencias.vm.empresa.utils.EmpresaVariables;

/**
 * @author César Palalía López (csr.plz@aisa-automation.com)
 * 
 */
@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class CuentasVM extends EmpresaVariables {

	private static final long serialVersionUID = -4947242108067565504L;

	@Init
	public void init() {
		super.init();
	}

	@Command
	@NotifyChange("municipiosCatalogo")
	public void getMunicipiosByEstado() {
		municipiosCatalogo = municipioService
				.getMunicipioByEstado(estadoSeleccionado);
		municipioSeleccionado = municipiosCatalogo.get(0);
	}

	@NotifyChange("*")
	@Command
	public void saveChanges() {
		organizacion.setPermiso(false);
		organizacionService.save(organizacion);
		domicilioService.save(organizacionDomicilio.getDomicilio());
		organizacionDomicilio.getDomicilio()
				.setMunicipio(municipioSeleccionado);
		organizacionDomicilioService.save(organizacionDomicilio);
		clavePersonal.setUsuario(IncidenciasUtils.encrypt(clavePersonal
				.getUsuario()));
		clavePersonal.setClave(IncidenciasUtils.encrypt(clavePersonal
				.getClave()));
		clavePersonal.setPersona(organizacion.getResponsable());
		clavePersonalService.save(clavePersonal);

		for (ConceptosCobranza conceptosCobranza : conceptosCobranzas) {
			conceptoCobranzaService.save(conceptosCobranza);
		}

		IncidenciasUtils.showMessage(
				"La información se ha guardado correctamente",
				Clients.NOTIFICATION_TYPE_INFO, 4000);
		super.init();
	}

	@Command
	public void buscarCompania() {
		Window companiaDialog = incidenciasUtils
				.createModelDialog(IncidenciasConstants.GLOBAL_PAGES.MODAL_VIEW_COMPANIA);
		companiaDialog.doModal();

	}

	@GlobalCommand
	@NotifyChange({ "*" })
	public void loadDatosCompania(
			@BindingParam("organizacionSeleccionada") Organizacion organizacionSeleccionada) {
		if (organizacionSeleccionada != null) {
			organizacion = organizacionSeleccionada;
			responsable = organizacion.getResponsable();
			clavePersonal = clavePersonalService.getClaveByCEO(organizacion
					.getResponsable());
			clavePersonal = clavePersonal == null ? new ClavePersonal()
					: clavePersonal;
			clavePersonal.setUsuario(IncidenciasUtils.decrypt(clavePersonal
					.getUsuario()));
			clavePersonal.setClave(IncidenciasUtils.decrypt(clavePersonal
					.getClave()));
			cuentaHabilitada = clavePersonal.getActivo() == null
					|| !clavePersonal.getActivo() ? "false" : "true";
			clavePersonal.setClaveRepetida(clavePersonal.getClave());
			organizacionDomicilio = organizacionDomicilioService
					.getByOrganizacion(organizacion);
			organizacionDomicilio = organizacionDomicilio != null ? organizacionDomicilio
					: new OrganizacionDomicilio();
			organizacionDomicilio.setOrganizacion(organizacionDomicilio
					.getOrganizacion() != null ? organizacionDomicilio
					.getOrganizacion() : organizacion);
			organizacionDomicilio.setDomicilio(organizacionDomicilio
					.getDomicilio() != null ? organizacionDomicilio
					.getDomicilio() : new Domicilio());
			servicioSeleccionado = organizacion.getServicios();
			conceptosCobranzas = conceptoCobranzaService
					.getConceptosCobranzaByOrganizacion(organizacion);

			/*
			 * municipioSeleccionado = organizacionDomicilio.getDomicilio()
			 * .getMunicipio(); estadoSeleccionado =
			 * municipioSeleccionado.getEstado();
			 */
			try {
				if (organizacion.getImagenPerfil() == null) {
					return;
				}
				File picture = new File(organizacion.getImagenPerfil());
				imageInBytes = incidenciasUtils.readFileToByteArray(picture);
				businessImage = (AImage)ImageUtils.scaleToSize(imageInBytes, 250, 400,
						"png").getContent();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	@Command
	public void enableDisableAccount() {
		if (cuentaHabilitada.equals("true")) {
			Messagebox
					.show("¿Está seguro de deshabilitar esta cuenta?, "
							+ "una vez deshabilidata, se revocarán los privilegios de acceso para este usuario",
							"Question", Messagebox.OK | Messagebox.CANCEL,
							Messagebox.QUESTION, new EventListener<Event>() {
								public void onEvent(Event event)
										throws Exception {
									if (((Integer) event.getData()).intValue() == Messagebox.OK) {
										clavePersonal.setActivo(true);
									}
								}
							});
		} else {
			clavePersonal.setActivo(false);
		}

	}

	@Command
	@NotifyChange("*")
	public void uploadProfilePicture(
			@ContextParam(ContextType.BIND_CONTEXT) BindContext ctx) {
		UploadEvent event = (UploadEvent) ctx.getTriggerEvent();
		Media mediaObj = event.getMedia();
		if (!(mediaObj instanceof Image)) {
			return;
		}
		Image imageRetrieved = (Image) mediaObj;

		try {
			imageInBytes = imageRetrieved.getByteData();
			imageFormat = imageRetrieved.getFormat();
			File perfilPictureFile = new File("C://" + organizacion.getNombre()
					+ ".png");
			FileOutputStream fos = new FileOutputStream(perfilPictureFile);
			fos.write(imageInBytes);
			fos.close();
			organizacion.setImagenPerfil(perfilPictureFile.getPath());
			businessImage = (AImage)ImageUtils.scaleToSize(imageInBytes, 250, 400,
					imageFormat).getContent();
		} catch (IOException e) {

		}
	}

	@Command
	@NotifyChange({ "conceptosCobranzas", "conceptoCobranzaSeleccionado" })
	public void agregarConceptoCobranza() {
		if (conceptoCobranzaSeleccionado != null
				&& conceptoCobranzaSeleccionado.getNombre() != null
				&& !conceptoCobranzaSeleccionado.getNombre().isEmpty()
				&& conceptoCobranzaSeleccionado.getCosto() != null
				&& conceptoCobranzaSeleccionado.getCosto() > 0) {
			if (!conceptosCobranzas.contains(conceptoCobranzaSeleccionado)) {
				conceptoCobranzaSeleccionado.setOrganizacion(organizacion);
				conceptosCobranzas.add(conceptoCobranzaSeleccionado);
			}
			conceptoCobranzaSeleccionado = new ConceptosCobranza();
		} else {
			IncidenciasUtils
					.showMessage(
							"Por favor especifique el nombre y la cantidad del concepto",
							Clients.NOTIFICATION_TYPE_WARNING, 2500);
			return;
		}
	}

	@Command
	public void removerConceptoCobranza() {
		Messagebox.show("¿Está seguro de remover este elemento?, "
				+ "esta acción es irreversible", "Question", Messagebox.OK
				| Messagebox.CANCEL, Messagebox.QUESTION,
				new EventListener<Event>() {
					public void onEvent(Event event) throws Exception {
						if (((Integer) event.getData()).intValue() == Messagebox.OK) {
							if (conceptoCobranzaSeleccionado
									.getIdConceptoCobranza() != null) {
								if (conceptosCobranzas
										.contains(conceptoCobranzaSeleccionado)) {
									conceptosCobranzas
											.remove(conceptoCobranzaSeleccionado);
								}
							} else {
								conceptosCobranzas
										.remove(conceptoCobranzaSeleccionado);
								conceptoCobranzaSeleccionado = new ConceptosCobranza();
							}
							BindUtils.postGlobalCommand(null, null,
									"updateConceptosCobranza", null);
						}
					}
				});

	}

	@GlobalCommand
	@NotifyChange({ "conceptosCobranzas", "conceptoCobranzaSeleccionado" })
	public void updateConceptosCobranza() {
		System.out.println("CuentasVM.updateConceptosCobranza()");
	}

	@Command
	public void asignarServicio() {
		if (servicioSeleccionado != null) {
			organizacion.setServicios(servicioSeleccionado);
		} else {
			IncidenciasUtils.showMessage(
					"Por favor seleccione el servicio que se deséa prestar",
					Clients.NOTIFICATION_TYPE_WARNING, 1000);
		}
	}

	@NotifyChange({ "conceptosCobranzas", "conceptoCobranzaSeleccionado" })
	@Command
	public void prepareConceptoForEdition(@BindingParam("index") Integer index) {
		if (index != null) {
			conceptoCobranzaSeleccionado = conceptosCobranzas.get(index);
		}
	}
}
